﻿using System;
// 标志枚举类型
// 枚举类型成员可以合并。
namespace _060_标志枚举类型
{
    // 为了避免混淆，合并枚举类型的成员要显式指定值，典型的增量为2。
    [Flags]
    public enum BorderSides { Left = 0, Right = 2, Top = 4, Bottom = 8 }
    class Program
    {
        static void Main(string[] args)
        {
            // 使用位运算符操作合并枚举类型的值，例如|和&，它们作用在对应的整型数值上。
            BorderSides leftRight = BorderSides.Left | BorderSides.Right;

            if ((leftRight & BorderSides.Left) != 0)
                Console.WriteLine("Includes left"); // Includes Left

            string formatted = leftRight.ToString(); // "Left, Right"
            BorderSides s = BorderSides.Left;
            s |= BorderSides.Right;
            Console.WriteLine(s == leftRight); // True

            s ^= BorderSides.Right; // 切换BorderSides.Right
            Console.WriteLine(s); // Left
            // 依照惯例，当枚举类型元素被合并时，一定要应用Flags属性。
            // 如果声明了一个没有标注Flags属性的枚举类型，枚举类型的成员仍然可以合并，但是当在该枚举实例上调用ToString方法时，输出一个数值而非一组名字。
            // 一般来讲，合并枚举类型通常用复数名而不用单数名。
            Console.ReadKey();
        }
    }
    // 为了方便起见，可以把合并的成员直接放在枚举的声明内：
    [Flags]
    public enum BorderSides1
    {
        None = 0,
        Left = 1, Right = 2, Top = 4, Bottom = 8,
        LeftRight = Left | Right,
        TopBottom = Top | Bottom,
        All = LeftRight | TopBottom
    }
}